package com.martin.lib_base.model

import androidx.compose.runtime.mutableStateListOf
import com.martin.lib_base.bean.common.FileBean
import com.martin.lib_base.interfaces.ILoading
import com.martin.lib_base.ktx.loge
import com.martin.lib_base.ktx.showToast
import com.martin.lib_base.ktx.toJson
import com.martin.lib_base.utils.MediaUtil
import com.martin.lib_base.utils.UploadUtil
import dev.DevUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlin.math.max

/**
 * @author：孟凡华
 * @date：2023/4/18
 * @desc：
 */
class MultipleImagePickModel(
    // 最大选择数量
    private val maxCount: Int = 9,
    // 是否需要上传
    private val needUpload: Boolean = true,
    /**
     * 回调
     * 选择完图片后都会调起
     */
    private val callBack: () -> Unit = {}
) {

    // 图片列表
    val imageList = mutableStateListOf<FileBean>().apply {
        add(FileBean())
    }

    /**
     * 选择图片
     */
    fun pickImage() {
        val activity = DevUtils.getTopActivity()
        MediaUtil.pickImage(activity, maxCount - getFileList().size) { list ->
            flow {
                list.forEach {
                    emit(it)
                }
            }
                // 上传图片
                .map {
                    val fileBean = FileBean()
                    fileBean.path = it.realPath
                    if (needUpload) {
                        fileBean.url = UploadUtil.upload(it.realPath).data?.url
                    }
                    fileBean
                }
                // 切换上传线程
                .flowOn(Dispatchers.IO)
                // 上传成功
                .onEach {
                    addItem(it)
                }
                // 切换上传成功后的线程
                .flowOn(Dispatchers.Main)
                // 异常处理
                .catch {
                    loge("上传图片异常 : ${it.toJson()}")
                    showToast("图片上传失败")
                }
                // 开始上传,展示loading
                .onStart {
                    if (activity is ILoading) {
                        activity.showLoading()
                    }
                }
                // 上传完成,隐藏loading
                .onCompletion {
                    if (activity is ILoading) {
                        activity.dismissLoading()
                    }
                    callBack()
                }
                .launchIn(GlobalScope)
        }
    }

    /**
     * 获取选择的图片列表
     */
    fun getFileList(): List<FileBean> {
        return imageList.filter { !it.path.isNullOrEmpty() }
    }

    /**
     * 删除图片
     */
    fun deleteItem(bean: FileBean) {
        imageList.remove(bean)
        // 删除后,如果没有添加按钮,则添加
        if (imageList.find { it.path.isNullOrEmpty() } == null) {
            imageList.add(FileBean())
        }
    }

    fun addItem(bean: FileBean) {
        loge("收集FileBean : ${bean.toJson(false)}")
        // 如果数量已达到临近最大,则删除添加按钮
        if (imageList.size == maxCount) {
            imageList.removeAt(imageList.size - 1)
        }
        imageList.add(max(imageList.size - 1, 0), bean)
    }

}